// Map方法

type student = {
  name: string;
  age: number;
  lastName: string;
};

const students: student[] = [
  {
    name: "John",
    age: 13,
    lastName: "",
  },
  {
    name: "Bob",
    age: 23,
    lastName: "",
  },
  {
    name: "Yhasx",
    age: 33,
    lastName: "",
  },
];

type NewStudent = {
  name: string;
  isAdult: boolean;
  lastName: string;
};

// 因为student本身就是entries所以可以直接解构，
// 如果你想解s构就要先去判断它是否可以迭代
//  of [1,2,3].entries() 这种就必须要用调用这个方法了。然后再去解构，当然如果你不考虑解构的问题，这个也可以跳过
for (const { name, age } of students) {
  console.log(name);
  console.log(age);
}

// !.map()方法 返回一个新数组，新数组中的元素是原数组中的元素调用函数处理后的值
//  判断age是否大于18，是的话就true，否则反之
const res: NewStudent[] = students.map(({ age, ...rest }) => ({
  ...rest,
  isAdult: age >= 18,
}));

console.log(res);

// !.find()方法 返回第一个满足条件的元素 如果没有找到则返回undefined
const student = res.find((student) => student.isAdult);
console.log(student);

function findFirstAdult(newStudents: NewStudent[]): NewStudent | undefined {
  for (const student of newStudents) {
    if (student.isAdult) return student;
  }
  return undefined;
}
console.log(findFirstAdult(res));

// !.filter方法 返回一个新数组，新数组中包含满足条件的元素  如果没有找到则返回空数组
const filterResult = res.filter((stu) => {
  return stu.isAdult;
});
console.log(filterResult);

function filterMinors(students: NewStudent[]): NewStudent[] {
  const minors: NewStudent[] = [];
  for (const student of students) {
    if (student.isAdult) minors.push(student);
  }
  return minors;
}
console.log(filterMinors(res));

// !every方法 返回一个布尔值，表示数组中的所有元素是否满足指定条件
const areAllAdults = students.every((stu) => {
  return stu.age >= 18;
});
console.log(areAllAdults);

function areAllAdultsFn(students: student[]): boolean {
  for (const { age } of students) {
    // 找到小于18的，因为你是要每个都是大于18才会true，只要有一个不满足就返回false
    if (age < 18) return false;
  }
  return true;
}
console.log(areAllAdultsFn(students));

// !.some方法 返回一个布尔值，表示数组中是否存在满足指定条件的元素
const atLeastOneAdult = students.some((stu) => {
  return stu.age >= 18;
});
console.log(atLeastOneAdult);

function some(students: student[]): boolean {
  for (const student of students) {
    // 只要找到有一个大于18就返回true，不需要循环每一个
    if (student.age >= 18) return true;
  }
  return false;
}
console.log(some(students));

// !.reduce方法 对数组中的每个元素执行一个由您提供的reducer函数(升序执行)，将其结果汇总为单个返回值
students.reduce((ac, cu) => {
  // console.log(index);
  // console.log(arr);
  return ac + cu.age;
}, 0);

const words = [
  "spray",
  "limit",
  "elite",
  "exuberant",
  "destruction",
  "present",
];
// TODO获取words数组中length最长的
const MaxLengthWords = words.reduce((ac, cu) => {
  return ac.length > cu.length ? ac : cu;
});
console.log(MaxLengthWords);
